package common

import (
	"regexp"
	"strings"
)

// BaseQuery 通用查询参数
type BaseQuery struct {
	Page int    `json:"page" form:"page"`
	Size int    `json:"size" form:"size"`
	Sort string `json:"sort" form:"sort"` //排序字段名：和前端约定 'field-'表示desc, 'field+'表示asc
}

func (q *BaseQuery) IsZero() bool {
	return q.Page == 0 && q.Size == 0
}

// Offset - 返回分页查询的偏移量（默认 0）
func (q *BaseQuery) Offset() int {
	if q.Page <= 0 {
		return 0
	}
	return (q.Page - 1) * q.Size
}

// Limit - 返回分页查询的数量限制（默认 10000）
func (q *BaseQuery) Limit() int {
	if q.Size <= 0 {
		return 10000
	}
	return q.Size
}

func (q *BaseQuery) SortField() string {
	//排序字段
	if q.Sort == "" {
		return "_id"
	}
	field := regexp.MustCompile(`^\W+|\W+$`).ReplaceAllString(q.Sort, "")

	if strings.HasSuffix(q.Sort, "-") { //这是和前端约定的排序指令
		return "-" + field //这是mongodb的排序格式
	}
	return field
}

// PageData 分页数据封装
type PageData[T any] struct {
	TotalCount int64 `json:"totalCount"` //总记录数
	TotalPage  int64 `json:"totalPage"`  //总页数
	Records    []T   `json:"records"`    //数据list
}

// SetTotal 赋值记录条数，分页条数
func (p *PageData[T]) SetTotal(totalCount int, pageSize int) {
	var value = (totalCount + pageSize - 1) / (pageSize)
	p.TotalCount = int64(totalCount)
	p.TotalPage = int64(value)
}
